<?php
/**
 * Created by luo.
 * Date: 2017/9/23 14:40
 * for: 后台公共 控制器
 */

namespace app\admin\controller;


use think\facade\Config;
use think\Controller;
use think\Db;
use think\exception\ErrorException;
use think\Hook;
use think\Model;

class BaseAdmin extends Controller
{

    /*public function _initialize(){
        //判断用户是否登录--行为钩子
        Hook::listen('admin_login',$params);
    }*/

    /**
     * 自动获取搜索条件 组装
     * @return array
     */
    protected function where(){
        $search = request()->except([Config::get('paginate.var_page'),'_'],'get');
        $map = [];
        if(is_array($search)){
            foreach($search as $key=>$value){
                if($value!=''){
                    if(is_numeric($value)){
                        if($value>-1){
                            $map[$key] = array('eq',$value);
                        }
                    }else{
                        $time = explode(' - ',$value);
                        if(is_array($time)&&count($time)==2){ //如果是时间
                            $map[$key] = ['between',[strtotime($time[0]),strtotime($time[1])]];
                        }else{
                            $map[$key]  = array('like','%'.$value.'%');
                        }
                    }
                }
            }
        }
        return $map;
    }

    /**
     * 万能搜索
     * @param $table 表名
     * @param bool $page 是否分页 默认分页
     * @param array $cond 附加条件  $map['key'] = ['op','value']
     * @param string $order
     * @return array|false|\PDOStatement|string|\think\Collection
     */
    protected function search($table, $page=true, $cond=[], $order='id desc', $field='*', $join=[]){

        $search = request()->except([Config::get('paginate.var_page'),'_'],'get');

        if($table instanceof Model){
            if(method_exists($table,'search')){
                return $table->search($search);
            }else{
                throw  new ErrorException(1,'模型不存在search方法',dirname(__FILE__),dirname(__LINE__ ));
            }
        }

        $map = [];
        if(is_array($search)){
            foreach($search as $key=>$value){
                if($value!=''){
                    if(strpos($key,'`_`') !==false){
                        $key = str_replace("`_`",".",$key);
                    }
                    
                    if($key!='mobile' && is_numeric($value)){
                        if(!empty($value)){
                            $map[] = array($key, 'eq',$value);
                        }
                    }else{
                        $time = explode(' - ',$value);
                        if(is_array($time)&&count($time)==2){ //如果是时间
                            $map[] = [$key, 'between',[strtotime($time[0]),strtotime($time[1])]];
                        }else{
                            if($key == 'startdate'){
                                $map[]  = array('ctime', '>=', strtotime($value));
                            }else if($key == 'enddate'){
                                $map[]  = array('ctime', '<=', strtotime($value));
                            }else{
                                $map[]  = array($key, 'like','%'.$value.'%');
                            }
                        }
                    }
                }
            }
        }
        
        //附加条件
        if(isset($cond)&&is_array($cond)){
            $map = array_merge($map,$cond);
        }

        $sum = 0;
        if(!empty($map['sum'])){
            unset($map['sum']);
            $sum = Db::name($table)->where($map)->alias('alias')->join($join)->sum('price');
        }

        //分页处理
        if ($page){
            $count = Db::name($table)->where($map)->alias('alias')->join($join)->count();
            $Page = new \VuePage($count);
            $lists = Db::name($table)->alias('alias')
            ->where($map)
            ->field($field)
            ->join($join)
            ->limit($Page->getStart(),$Page->getEnd())
            ->order($order)
            ->select();
            //echo Db::name($table)->getLastSql();exit;
            $Page->setData($lists);
            $pagelist = $Page->show();
            $pagelist['sum'] = $sum;
            return $pagelist;
        }else{
            return [
                'lists' =>Db::name($table)->where($map)->order($order)->select(),
                'count' => Db::name($table)->where($map)->count(),
                'total' => 1,
                'current' =>1,
                'size' => Config::get('paginate.list_rows'),
                'sum' => $sum
            ];

        }

    }


    



    /**
     * 获取远程图片的宽高和体积大小
     *
     * @param string $url 远程图片的链接
     * @param string $type 获取远程图片资源的方式, 默认为 curl 可选 fread
     * @param boolean $isGetFilesize 是否获取远程图片的体积大小, 默认false不获取, 设置为 true 时 $type 将强制为 fread 
     * @return false|array
     */
    function myGetImageSize($url, $type = 'curl', $isGetFilesize = false) 
    {
        // 若需要获取图片体积大小则默认使用 fread 方式
        $type = $isGetFilesize ? 'fread' : $type;
     
         if ($type == 'fread') {
            // 或者使用 socket 二进制方式读取, 需要获取图片体积大小最好使用此方法
            $handle = @fopen($url, 'rb');
     
            if (! $handle) return false;
     
            // 只取头部固定长度168字节数据
            $dataBlock = fread($handle, 168);
        }
        else {
            // 据说 CURL 能缓存DNS 效率比 socket 高
            $ch = curl_init($url);
            // 超时设置
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            // 取前面 168 个字符 通过四张测试图读取宽高结果都没有问题,若获取不到数据可适当加大数值
            curl_setopt($ch, CURLOPT_RANGE, '0-167');
            // 跟踪301跳转
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            // 返回结果
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     
            $dataBlock = curl_exec($ch);
     
            curl_close($ch);
     
            if (! $dataBlock) return false;
        }
     
        // 将读取的图片信息转化为图片路径并获取图片信息,经测试,这里的转化设置 jpeg 对获取png,gif的信息没有影响,无须分别设置
        // 有些图片虽然可以在浏览器查看但实际已被损坏可能无法解析信息 
        $size = getimagesize('data://image/jpeg;base64,'. base64_encode($dataBlock));
        if (empty($size)) {
            return false;
        }
     
        $result['width'] = $size[0];
        $result['height'] = $size[1];
     
        // 是否获取图片体积大小
        if ($isGetFilesize) {
            // 获取文件数据流信息
            $meta = stream_get_meta_data($handle);
            // nginx 的信息保存在 headers 里，apache 则直接在 wrapper_data 
            $dataInfo = isset($meta['wrapper_data']['headers']) ? $meta['wrapper_data']['headers'] : $meta['wrapper_data'];
     
            foreach ($dataInfo as $va) {
                if ( preg_match('/length/iU', $va)) {
                    $ts = explode(':', $va);
                    $result['size'] = trim(array_pop($ts));
                    break;
                }
            }
        }
     
        if ($type == 'fread') fclose($handle);
     
        return $result;
    }




    /**
    **上传地址
    **/
    
    public function base64_upload($base64_image_content, $filePath){
        //匹配出图片的格式
        if (strpos($base64_image_content,'base64') !== false && preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
            $type = $result[2];
            $filePaths = 'uploads' . DS .$filePath;
            if(!file_exists($filePaths)){
                mkdir($filePaths,0777,true);
            }

            $new_file = $filePaths."/".date('Ymd',time())."/";
            if(!file_exists($new_file)){
                //检查是否有该文件夹，如果没有就创建，并给予最高权限
                mkdir($new_file, 0777);
            }

            $thumb_path = $new_file.md5(microtime(true)).'_thumb_200'.".{$type}";
            $new_file   = $new_file.md5(microtime(true)).".{$type}";
            if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
                //缩略图
                $image = \think\Image::open($new_file);
                $image->thumb(200, 200)->save($thumb_path);

                return DS . $new_file;
            }else{
                return false;
            }
        }else{
            return $base64_image_content;
        }
    }
    

}